module.exports = function(grunt) {

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    clean: ['doc'],
    concat: {
      options: {
        separator: ';'
      },
      dist: {
        src: ['src/Isometric.js', 'src/**/*.js'],
        dest: 'dist/<%= pkg.name %>.js'
      }
    },
    jshint: {
      src: ['src/**/*.js'],
      options: {
        "globals"     : { "Phaser": false, "PIXI": false, "p2": false },
        // Ignore Environment Globals
        "browser"     : true,   // Standard browser globals e.g. `window`, `document`.

        // Development
        "devel"       : true,   // Allow developments statements e.g. `console.log();`.

        // ECMAScript Support
        "es3"         : true,   // Support legacy browser and javascript environments.
        "esnext"      : false,  // This option tells JSHint that your code uses ECMAScript 6 specific syntax.
        "strict"      : false,  // Require `use strict` pragma in every file.
        "globalstrict": false,  // Allow global "use strict" (also enables 'strict').

        // Functionality
        "bitwise"     : false,  // Prohibit bitwise operators (&, |, ^, etc.).
        "boss"        : true,   // Tolerate assignments inside if, for & while. Usually conditions & loops are for comparison, not assignments.
        "camelcase"   : true,   // Force all variable names to use either camelCase style or UPPER_CASE with underscores.
        "curly"       : true,   // Require {} for every new block or scope.
        "eqeqeq"      : false,  // Require triple equals i.e. `===`.
        "eqnull"      : true,   // Tolerate use of `== null`.
        "evil"        : false,  // Tolerate use of `eval`.
        "expr"        : false,  // Tolerate `ExpressionStatement` as Programs.
        "forin"       : false,  // Tolerate `for in` loops without `hasOwnPrototype`.
        "freeze"      : true,   // Prohibits overwriting prototypes of native objects such as Array and Date.
        "funcscope"   : true,   // This option suppresses warnings about declaring variables inside of control structures while accessing them later from the outside.
        "immed"       : true,   // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`
        "latedef"     : true,   // Prohibit variable use before definition.
        "laxbreak"    : false,  // Tolerate unsafe line breaks e.g. `return [\n] x` without semicolons.
        "laxcomma"    : false,  // This option suppresses warnings about comma-first coding style.
        "loopfunc"    : true,   // Allow functions to be defined within loops.
        "noarg"       : true,   // Prohibit use of `arguments.caller` and `arguments.callee`.
        "notypeof"    : false,  // This option suppresses warnings about invalid typeof operator values.
        "shadow"      : true,   // Allows re-define variables later in code e.g. `var x=1; x=2;`.
        "smarttabs"   : false,  // This option suppresses warnings about mixed tabs and spaces when the latter are used for alignmnent only.
        "supernew"    : false,  // Tolerate `new function () { ... };` and `new Object;`.
        "undef"       : true,   // Require all non-global variables be declared before they are used.
        "unused"      : true,   // This option warns when you define and never use your variables.

        // Styling
        "indent"      : 4,      // Specify indentation spacing
        "newcap"      : true,   // Require capitalization of all constructor functions e.g. `new F()`.
        "noempty"     : true,   // Prohibit use of empty blocks.
        "nonew"       : true,   // Prohibit use of constructors for side-effects.
        "plusplus"    : false,  // Prohibit use of `++` & `--`.
        "quotmark"    : false,  // This option enforces the consistency of quotation marks used throughout your code.
        "sub"         : true,   // Tolerate all forms of subscript notation besides dot notation e.g. `dict['key']` instead of `dict.key`.
        "trailing"    : true    // Prohibit trailing whitespaces.
      }
    },
    uglify: {
      options: {
        banner: '/* Phaser Isometric <%= pkg.version %> - <%= grunt.template.today("dd-mm-yyyy") %> by Lewis Lane <lew@rotates.org>*/\n'
      },
      dist: {
        files: {
          'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
        }
      }
    },
    watch: {
      scripts: {
        files: ['src/**/*.js'],
        tasks: ['default']
      }
    },
    jsdoc : {
        docstrap : {
            src: ['src/**/*.js'], 
            options: {
              destination: 'doc',
              template : "node_modules/ink-docstrap/template",
              configure : "node_modules/ink-docstrap/template/jsdoc.conf.json",
              private: false
            }
        }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-jsdoc');

  grunt.registerTask('default', ['concat', 'jshint', 'uglify']);
  grunt.registerTask('docs', ['jsdoc:docstrap']);
};